package com.project.poetry.service.service;

import com.project.poetry.service.entity.dto.flyingflower.FlyingFlowerAnswerDTO;
import com.project.poetry.service.entity.dto.flyingflower.FlyingFlowerDTO;
import com.project.poetry.service.entity.dto.flyingflower.FlyingFlowerDetailDTO;
import com.project.poetry.service.entity.dto.flyingflower.FlyingFlowerRankingDTO;
import com.project.poetry.service.entity.po.flyingflower.FlyingFlowerPO;
import com.project.poetry.service.entity.po.user.UserPO;

import java.util.List;

/**
 * 飞花令业务层接口
 * @author mengxj
 */
public interface FlyingFlowerService {

    /**
     * 根据关键字获取内容
     * @param keyWord 关键字
     * @param flyingId 飞花令id
     * @param user 当前人
     * @return 根据关键字获取的内容
     */
    FlyingFlowerDTO getContentByKeyWord(String keyWord, Long flyingId, UserPO user);

    /**
     * 保存玩家输入的答案
     * @param flyingFlowerAnswer 玩家输入的答案
     * @param user 当前人
     */
    void saveFlyingFlowerAnswer(FlyingFlowerAnswerDTO flyingFlowerAnswer, UserPO user);

    /**
     * 保存玩家游戏记录
     * @param flyingId 飞花令id
     * @param user 当前人
     */
    void finish(Long flyingId, UserPO user);

    /**
     * 根据关键字查询游戏历史
     * @param keyWord 关键字
     * @param status 状态
     *               -1：全部
     *               1：已完成
     *               2：未完成
     *               3：未存档
     * @param user 当前人
     * @return 游戏历史列表
     */
    List<FlyingFlowerPO> flyingFlowerHistory(String keyWord, Integer status, UserPO user);

    /**
     * 根据飞花令id查询答题过程详情
     * @param flyingId 飞花令id
     * @return 答题过程详情
     */
    List<FlyingFlowerDetailDTO> flyingFlowerDetail(Long flyingId);

    /**
     * 答题排行榜 前 num 名
     * @param num 查询条数
     * @return 排行榜数据
     */
    List<FlyingFlowerRankingDTO> ranking(Integer num);

    /**
     * 继续游戏进度
     * @param flyingId 飞花令id
     * @param user 当前人
     * @return 本次飞花令游戏信息
     */
    FlyingFlowerPO continueFlyingFlower(Long flyingId, UserPO user);

    /**
     * 修改飞花令信息
     * @param flyingId 飞花令id
     * @param flag 标识
     *             1：修改信息，所有字段变更
     *             2：保存进度，是否成功字段与结束时间字段不修改
     */
    void updateFlyingFlower(Long flyingId, int flag);
}
